<?php

/**
 * @version		1.0.0 gerenciador_de_arquivos $
 * @package		gerenciador_de_arquivos
 * @copyright	Copyright © 2012 - All rights reserved.
 * @license		GNU/GPL
 * @author		Edio Hanoway Kepke
 * @author mail	hanoway12@gmail.com 
 */
require_once(dirname(__FILE__).DS.'tools'.DS.'error.php');
require_once(dirname(__FILE__).DS.'arquivo.php');
class ArquivoDAO 
{
    const PESQUISA_SIMPLES = "simples";
    const PESQUISA_ASSUNTO = "assunto";

    private $table = "mod_file_arquivo";
    
    
    /**
    * @var    ArquivoDAO
    * @since  1.0
    */
    private static $arquivoDAO;

    
    /**
    * @var    JDatabase
    * @since  11.1
    */
    private $db;

    private function __construct() { }
    
    
    /**
    *  Get a ArquivoDAO object.
    *
    * Retorna uma istancia de Arquivo DAO.
    *
    * @return  ArquivoDAO object
    *
    * @see     ArquivoDAO
    * @since   1.0
    */
    public static function instance()
    {
        if(is_null(self::$arquivoDAO))
        {
            self::$arquivoDAO = new ArquivoDAO();                       
       }                
       
       return self::$arquivoDAO;
    }
    
    public function setDb($db) { $this->db = $db; }
    
    public function insert($arquivo, $getId = false)
    {
//        $this->db = JFactory::getDbo();
            
        $arquivoOBJ = new Arquivo(trim($arquivo["titulo"]), trim($arquivo["tipo"]), $arquivo["id_dono"], $arquivo["file"]);
        
        if(isset($arquivo["ano"]))
        {
            $arquivoOBJ->setAno(trim($arquivo["ano"]));
        }
        
        if(isset($arquivo["subtitulo"]))
        {
            $arquivoOBJ->setSub_titulo(trim($arquivo["subtitulo"]));
        }
        try 
        {
            $salvo = $this->db->insertObject($this->table, $arquivoOBJ);
                                    
            if($getId)
            {
                return $this->db->insertid();                
            }
            
            return $salvo;            
        } 
        catch (Exception $exc) 
        {
            echo false;
        }               
    }
    
    public function update($arquivo)
    {
                
    }
    
    public function delete($arquivo)
    {
                
    }
                
    public function select($options)
    {   
        $ids = null;
        
        if(isset($options->tipo))
        {            
            if(isset($options->key))
            {
                $ids = $this->selectSimples($options);                
            }
            else
            {                                
            }
                                    
            if($ids)
            {
                $arquivos = array();
                
                foreach ($ids as $id) 
                {                                                            
                    $tempArquivo = $this->selectArquivo($id);
                                        
                    $arquivoAssuntoDAO = ArquivoAssuntoDAO::instance();                   
                    $arquivoAssuntoDAO->setDb($this->db);
                    
                    $tempArquivo["assuntos"] = $arquivoAssuntoDAO->selectAssuntosArquivo($id);
                    
                    
                    $arquivoAutorDAO = ArquivoAutorDAO::instance();                   
                    $arquivoAutorDAO->setDb($this->db);                    
                    $tempArquivo["autores"] = $arquivoAutorDAO->selectAutoresArquivo($id);
                                                            
                    $arquivos[] = $tempArquivo;                                                                          
                }
                
                if(!empty($arquivos))
                {
                    return $arquivos;            
                }
            }                        
        }
        
        
        return false;                                            
    }
        
    private function selectSimples($options)
    {                
        $ids = array();
        
        if(isset($options->key))
        {     
            $tempIds = $this->selectArquivoAutor($options->key);
                                    
            if(count($tempIds) > 0)
            {             
                $ids = $tempIds;
            }
            
            $tempIds = $this->selectArquivoAssunto($options->key);
                                    
            if(count($tempIds) > 0)
            {                
                $ids = array_merge($ids, $tempIds);
            }
            
            
            $tempIds = $this->selectArquivoTituloSubTitulo($options->key);
                                    
            if(count($tempIds) > 0)
            {                
                $ids = array_merge($ids, $tempIds);
            }
            
            $ids = array_unique($ids);
            
            
            return $ids;                        
        }
        
        return false;                
    }
    
    private function selectArquivoAutor($autor)
    {        
        $query = $this->db->getQuery(true);
        $query->select('arquivo.id as id_arquivo');
        $query->from("mod_file_arquivo as arquivo");           
        $query->innerJoin("
                            mod_file_arquivo_autor as arquivo_autor 
                            on 
                            arquivo.id = arquivo_autor.id_arquivo
                          ");
        $query->innerJoin("
                            mod_file_autor as autor
                            on
                            arquivo_autor.id_autor = autor.id
                          ");            

        $query->where("autor.nome like '%".trim($autor)."%'");
        
        $query->group("arquivo.id");
        
        $this->db->setQuery($query);
        
        return $this->db->loadResultArray();                        
    }
    
    private function selectArquivoAssunto($assunto)
    {                        
        $query = $this->db->getQuery(true);
        $query->select('arquivo.id as id_arquivo');
        $query->from("mod_file_arquivo as arquivo");           
        $query->innerJoin("
                            mod_file_arquivo_assunto as arquivo_assunto
                            on
                            arquivo.id = arquivo_assunto.id_arquivo
                          ");
        $query->innerJoin("
                            mod_file_assunto as assunto
                            on
                            arquivo_assunto.id_assunto = assunto.id
                          ");           

        $query->where("assunto.assunto like '%".trim($assunto)."%'");
        
        $query->group("arquivo.id");
        
        $this->db->setQuery($query);
        
        return $this->db->loadResultArray();                        
    }
        
    private function selectArquivoTituloSubTitulo($key)
    {        
        $query = $this->db->getQuery(true);
        $query->select('id');
        $query->from("mod_file_arquivo");                   
        $query->where("titulo like '%".  trim($key)."%'", "or");
        $query->where("sub_titulo like '%".trim($key)."%'", "or");
        $query->where("tipo like '%".trim($key)."%'", "or");
                                        
        $this->db->setQuery($query);
                        
        return $this->db->loadResultArray();                         
    }                

    
    
    /**    
    * @return  Arquivo object
    *
    * @see     Arquivo
    * @since   1.0
    */
    private function selectArquivo($id)
    {
        $query = $this->db->getQuery(true);       
        $query->select('arquivo.id, 
                         arquivo.titulo,
                         arquivo.sub_titulo, 
                         arquivo.ano, 
                         arquivo.tipo, 
                         arquivo.url_arquivo, 
                         arquivo.criado_em                         
                        ');
        
        $query->from("mod_file_arquivo as arquivo");         

        $query->where(" arquivo.id = '".$id."'");
        
        $this->db->setQuery($query);
        
        return $this->db->loadAssoc();
    }
}
?>
